#include<iostream>
#include <signal.h>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>

using namespace std;
typedef function<void()>func;
vector<func>callbacks;
int count=0;
void Log()
{
    cout<<"这个是日志信息"<<endl;
}
void print()
{
    cout<<"final count:"<<count<<endl;
}
void who()
{
    pid_t id=fork();
    if(id==0)
    {
        execl("/usr/bin/who","who",nullptr);
        exit(1);
    }
    wait(nullptr);
}
void handler(int signum)
{
    /* sleep(1);
    cout<<"捕获了一个信号:"<<signum<<endl; */
    //cout<<"final count:"<<count<<endl;//只最后一次打印count,结果可以达到几亿
    for(auto f:callbacks)
    {
        f();
    }
    cout<<endl; 
    alarm(1);//想要定期完成一些事情，在闹钟触发后，再设置一个
}
static void usage(char* process)
{
    cout<<"process\n";
}
int main(int argc,char*argv[])
{
    
    
    //2.使用系统调用发信号
    /* if(argc!=3)
    {
     usage(argv[0]);
     exit(1);
    } */
    //int signum=atoi(argv[1]);
    //int pid=getpid();
   // cout<<"我正在运行，我的pid是："<<getpid()<<endl;
    //abort();//常用来终止进程
   // raise(8);//给调用进程本身发送一个信号
 // kill(pid,signum);





callbacks.push_back(print);
 callbacks.push_back(Log);
   
  callbacks.push_back(who);

 // 3.软件条件产生信号
 signal(SIGALRM,handler);
 alarm(1);//设置了一个闹钟，闹钟一旦触发，就会自动移除
 while(true)//1s内count可以加至几万，因为每次往显示器打印有IO,网络发送
 {
    count++;
   // cout<<count<<endl;
 }
 
  
  
  
  
  
  
  
   //signal函数，仅仅只是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
   //只是提前注册了个方法，有信号产生才会被调用
    /* signal(SIGINT,handler);
    while(true)
    {
        sleep(1);
        cout<<"进程正在运行中..."<<"pid:"<<getpid()<<endl;
    } */
   /*  pid_t id=fork();
    int a;
    if(id==0)
    {
        a/=0;
        exit(1);
    }
    int status=0;
    waitpid(id,&status,0);
    cout<<"我是父进程，我的pid是："<<getpid()<<"终止信号："<<(status&0x7F)<<"is core:"<<((status>>7)&1)<<endl; */
    return 0;
}